package com.heys.InerClass;

/**
 * Out 内部类和lambda表达式
 * 内部类 位置在一个类的内部
 * 其他的和正常类一致
 * 意义：解决2个问题
 * 1、封装 extends 单继承 
 * 2、多继承
 */
public class Out {

    private int num = 10;

    private static int age = 100;

    public void print2(Comsumer2 comsumer2,String data){
        comsumer2.print(data);
    }






    //外部类访问内部类 必须实例化 且 不能访问private
    public void print(){
        Comsumer cd = new ComsumerImpl();
        cd.print();

        //******************************** */
      Comsumer c =  new Comsumer(){
       
           @Override
           public void print() {
               System.out.println("我是匿名内部类");
           }
       };
       c.print();
        /**********************************************************8 */
        //右边是要实现的方法的方法体 主旨 代表 直接的业务逻辑
       Comsumer cc = (/**代表形参*/)->System.out.println("wo shi  aaaa");//方法体
       cc.print();

      // Comsumer2 c2 = (String t)-> System.out.println(t);
      Comsumer2 c2 = (t)-> System.out.println(t);//java 类型推到 入表达式 的直接口 只能有一个抽象方法
       c2.print("hello");
       c2.get();

       Comsumer3 c3 = ()->{
        boolean b = 1<2;
        return b;
       };
       Comsumer3 cc3 = ()-> 1>2;

    }

public class ComsumerImpl implements Comsumer{

    @Override
    public void print() {
        System.out.println("不是匿名内部类");
    }
    
}

/**
 * 
 */
public interface Comsumer3 {

    boolean test();
}

 /**
  * 
  */
  @FunctionalInterface//只有提示功能
 public interface  Comsumer2{
    
    void print(String data);
     //虽然只用一个方法接口（抽象的）但是他能有多个默认实现 不能重写抽象方法,重载
    default int get(){
        return 1+1;
    }
   default void print(String data,int b){

    }
 }
 /**
  * Comsumer
  */
 public interface Comsumer {
    
    void print();
     
 }




    public static void printf(){
        //局部内部类
       final int a = 10; //必须是不可变的 要final 修饰
        class m {
            void set(){
                System.out.println("*********************"+a);
            }
        }
        
    }


    //静态 只访问静态修饰 静态成员内部类
    public static class StaticClass {
        
        public void print() {
           int i =  Out.age;
           new Out().print();
           Out.printf();
        }
        
        
    }


    /**
     * InnerOut
     * 成员内部类
     */
    private class InnerOut {
    
        private String name = "inner_name";
        //内部访问外类 可以访问所有成员变量
        public void find() {
         int i =  Out.this.num;

        }


        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        
        
    }

    
}